﻿#ifndef CALCULATOR_H
#define CALCULATOR_H

// Coding: UTF-8(BOM)
#if defined(_MSC_VER) && (_MSC_VER >= 1600)
#pragma execution_character_set("utf-8")
#endif

#include <iostream>
#include <string>
#include <vector>
#include <map>

namespace CalclulatorType {
//表达式判断结果
enum ExpressionJudge{
    ALL_RIGHT,
    STR_EMPTY,
    INPUT_ERR,
    MISS_MATCH
};
//运算数vector
typedef std::vector<double> NumberVec;
//运算符vector
typedef std::vector<char> OperatorVec;
//操作符常量
namespace Operator {
const char B_left = '(';//左括号
const char B_right = ')';//右括号
const char DOT = '.';//小数点
const char TRUE = 't';//true
const char FALSE = 'f';//false
//数学运算符
namespace Math {
const char MUL = '*';//乘法
const char DIV = '/';//除法
const char MOD = '%';//余数/取模
const char ADD = '+';//加法
const char SUB = '-';//减法
}
//逻辑运算符
namespace Logic {
//优先级1
const char GT = '>';//大于
const char GTE = 'V';//大于等于
const char LT = '<';//小于
const char LTE = 'v';//小于等于
//优先级2
const char EQ = '=';//等于
const char NEQ = '#'; //不等于
//优先级3
const char AND = '&';//逻辑与，并且
//优先级4
const char OR = '|';//逻辑或，或者
}
}
// 乘除模过程产生负数 替换字符
typedef std::map<std::string,std::string> OperMulStdMap;
typedef std::pair<std::string,std::string> OperMulStdPair;
}

using namespace CalclulatorType;

//计算类，支持 + - * / % 数学运算和 && || > ≥ < ≤ == 逻辑运算
class Calculator
{
private:
    OperMulStdMap operMulStdMap;
public:
    Calculator();
    //表达式检测
    ExpressionJudge checkExpression(std::string & expression);
    //表达式运算
    std::string calcExpression(std::string & expression,bool &dividendIsZero);
private:
    //括号检测：匹配检测，去除多余的括号
    ExpressionJudge checkParentheses(std::string & expression);
    //解析表达式，将数据放到vector中
    void expressionToVec(const std::string & expression,
                         NumberVec &numberVec,
                         OperatorVec &operatorVec);
    //无括号的 表达式运算
    std::string calcString(std::string & expression,bool &dividendIsZero);
    //算术运算 过程中产生负数处理
    void plusMinusProcess(std::string & expression);

};

#endif // CALCULATOR_H
